#ifdef SU1
#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef double ld;
typedef pair<ld, ld> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
//const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

pt operator +(const pt& a, const pt& b) {
	return pt(a.x + b.x, a.y + b.y);
}
pt operator -(const pt& v) {
	return pt(-v.x, -v.y);
}

inline ld readLd() {
	double x;
	assert(scanf("%lf", &x) == 1);
	return ld(x);
}

const int N = 100500;
int n;
ld pw;
ld vw[N], pf[N], th[N], vf[N];

inline bool read()
{
	assert(scanf("%d", &n) == 1);
	if (n == 0) return false;
	pw = readLd();
	forn(i, n) {
		vw[i] = readLd();
		pf[i] = readLd();
		vf[i] = readLd();
		th[i] = readLd();
	}
	return true;
}

pair<ld,pt> evs[N];
int szevs;

inline void solve()
{
	pt curLine(pw, 0);
	szevs = 0;
	forn(i, n) {
//		cerr << th[i] << ' ' << pf[i] << ' ' << vf[i] << endl;
		pt cur = pt(-vw[i] * pf[i] / vf[i], th[i] * pf[i] / vf[i]);
		if (abs(vw[i]) < EPS) {
			ld curCost = max(ld(0), th[i] * pf[i] / vf[i]);
			curLine = curLine + pt(0, curCost);
		} else if (vw[i] > 0) {
			curLine = curLine + cur;
			evs[szevs++] = mp(th[i] / vw[i], -cur);
		} else {
			evs[szevs++] = mp(th[i] / vw[i], cur);
		}
	}
	evs[szevs++] = mp(0, pt(0, 0));
	sort(evs, evs + szevs);
	ld ans = 1e100;
	forn(i, szevs) {
		ld W = evs[i].x;
		curLine = curLine + evs[i].y;
		ld cur = curLine.x * W + curLine.y;
//		cerr << W << ' ' << cur << endl;
		if (W < -EPS) continue;
		ans = min(ans, cur);
	}
	printf("%.10lf\n", double(ans));
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);

	while (read()) {
		solve();
	}
	
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
